終於,我們有關 xml 語法相關檔案的介紹來到最後一篇了!!!想當初筆者也是花了很多時間,一點一滴的收集資料後,才能夠勉強操作檔案內容,還常常會被不知名的 bug 弄得頭昏腦脹,接下來就看看今天所要介紹的 world 檔的功用,還有如何操作吧!
一樣從問問題開始吧,什麼是 world 檔 ?
world 是針對 gazebo,所寫出來的 xml 格式檔案,目的就是透過建立相關參數,設定所需要的模擬環境來模擬機器人所要應對的實際情況。那創建一個自己的世界難嗎 ? 別擔心,應該只會比 minecraft 這個遊戲難一點吧。下面是一個 world 檔的程式碼,大家可以試著用已經學過 xml 概念去解讀一下。
<sdf version='1.4'>
<world name='default'>
<!-- A global light source -->
<include>
<uri>model://sun</uri>
</include>
<!-- A ground plane -->
<include>
<uri>model://ground_plane</uri>
</include>
<physics type="ode">
<real_time_update_rate>1000.0</real_time_update_rate>
<max_step_size>0.001</max_step_size>
<real_time_factor>1</real_time_factor>
<ode>
<solver>
<type>quick</type>
<iters>150</iters>
<precon_iters>0</precon_iters>
<sor>1.400000</sor>
<use_dynamic_moi_rescaling>1</use_dynamic_moi_rescaling>
</solver>
<constraints>
<cfm>0.00001</cfm>
<erp>0.2</erp>
<contact_max_correcting_vel>2000.000000
</contact_max_correcting_vel>
<contact_surface_layer>0.01000</contact_surface_layer>
</constraints>
</ode>
</physics>
<!-- Load world -->
<include>
<uri>model://turtlebot3_world</uri>
</include>
<scene>
<ambient>0.4 0.4 0.4 1</ambient>
<background>0.7 0.7 0.7 1</background>
<shadows>true</ shadows>
</scene>
<gui fullscreen='0'>
<camera name='user camera'>
<pose>0.8 0.0 12.0 0 1.5708 0</pose>
<view_controllervorbit</view_controller>
</camera>
</world>
</sdf>
不太理解的讀者也沒關係,接下來我們稍微講一下比較重要的標籤的意義,至於其他部分為什麼不多做解釋呢?是因為以下幾個是較基本、重要的標籤,有興趣的讀者也可以到下面提供連結看看其他更多的標籤意義。
例:
<sdf version='1.4'>
<world name='default'>
<!-- A global light source -->
<include>
<uri>model://sun</uri>
</include>
首先<!-- A global light source -->
這表示註解,幫助你知道以下的資料對應的是哪個部分。再來看到 <sdf>
,這裡可以看到它是用來宣布這個 world 檔它所使用的語言版本是第幾代,因為有些標籤在較前面的版本是不存在的,所以要特別注意。
接著 <include>
這個標籤就是用於導入別的檔案,如同我們上個章節所講的。但我們要看到的是 <uri>
裡面所導入的一個 model 模型模型 sun ,就像標籤所講的這就是在加入一顆太陽在你的世界之中,其他的世界物件也可以以此類推。
然後我們看到 <physics>
,它的作用就是在設定你世界的 物理參數,諸如時間、重力等等,其項目繁多就不一個一個說明了,有關更多標籤和設定可以參考這個網站。
物理設定:
<physics type="ode">
<real_time_update_rate>1000.0</real_time_update_rate>
<max_step_size>0.001</max_step_size>
<real_time_factor>1</real_time_factor>
<ode>
<solver>
<type>quick</type>
<iters>150</iters>
<precon_iters>0</precon_iters>
<sor>1.400000</sor>
<use_dynamic_moi_rescaling>1</use_dynamic_moi_rescaling>
</solver>
<constraints>
<cfm>0.00001</cfm>
<erp>0.2</erp>
<contact_max_correcting_vel>2000.000000
</contact_max_correcting_vel>
<contact_surface_layer>0.01000</contact_surface_layer>
</constraints>
</ode>
</physics>
對於一個基本的 emptyworld 的內容就介紹到這邊就好,由於官網已經有設定好的空白世界檔所以不必太擔心要從頭來。
那當你設定好 world 後,使用 <launch>
將他包圍,還有前面一直提到 <include>
導入檔案的方法,變成一個 empty_world.launch
檔後,就可以如下圖一般把它導入你主要使用的 launch,就能一鍵開啟啦!
例:(加入機器人還有 world 設定的綜合 launch)
<launch>
<arg name="model" default="waffle" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="x_pos" default-"0.0"/>
<arg name="y_pos" default="0.0"/>
<arg name="z_pos" default="0.0"/>
<!--導入空白世界的launch-->
<include file="$(find gazebo_ros)/launch/empty_world. launch">
<arg name="world_name" value="$(find turtlebot3_gazebo)/worlds /empty.world"/>
<arg name="paused" value="false"/>
<arg name="use_sim_time" value="true"/>
<arg name="gui" value="true"/>
<arg name="headless" value="false"I>
<arg name="debug" value="false"/>
</include>
<!--導入結束-->
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg
model) .urdf.xacro"
<node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model turtlebot3_$(arg model) -x $(arg x_pos)-y $(arg y_pos)
-z $(arg z_pos)-param robot_description" />
</launch>
大家還能看到 <arg name=” model” default……/>
,還有底下的 <arg name xyz_pos>
,這兩個標籤其實是在設定你模型的種類,還有在世界上的座標位置。
接著看到 <include>
下,也有許多 <arg name=….>
,這裡就是在對你當初寫好的的 world 檔中標籤參數做修改,value="ture"
就是開啟標籤內容,反之亦然。
很快的連假已經進入尾聲,所幸這幾天的鐵人賽也都很順利的完成,還以為會因為連假怠惰而不小心失敗。筆者也很佩服其他同樣參加鐵人賽的前輩,有著能夠堅持下去的精神。那經過前面的基本介紹後,我們已經具備進入實際模擬,組合自己自走車的能力了,明後天我們就會開始介紹如何安裝還有使用 gazebo 跟 rviz 以及裡面的基礎操作,請大家敬請期待!!